//package org.cyz.tools.common.util;
//
//import org.cyz.tools.common.bean.DBInfo;
//import org.cyz.tools.common.bean.Settings;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.io.File;
//import java.lang.reflect.Field;
//import java.lang.reflect.InvocationTargetException;
//import java.lang.reflect.Method;
//import java.sql.*;
//import java.util.*;
//
///**
// * @program: RedisGUI
// * @description: sqlite util
// * @author: Chenyz
// * @create: 2020-08-10 21:02
// **/
//
//public class SqliteUtil {
//    private static Logger logger = LoggerFactory.getLogger(SqliteUtil.class);
//
//    private static String drivde = "org.sqlite.JDBC";
//    private static String conn = "jdbc:sqlite:" + System.getProperty("user.dir") + "/.redis-gui/redis-gui.db";
//    private static Connection connection = null;
//    public static LinkedList<Connection> pool;
//    private static int poolSize = 15;
//
//    private static volatile Connection pub_conn;
//    private static volatile Statement pub_statement;
//
//    static {
//        try {
//            checkDBFile();
//            Class.forName(drivde);
//            initConnection();
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        }
//    }
//
//    private static void checkDBFile() {
//        ///db/redis-gui.db
//        String filePath = System.getProperty("user.dir") + "/.redis-gui/redis-gui.db";
//        logger.info("db-path:{}",filePath);
//        File file = new File(filePath);
//        if (!file.exists()) {
//            boolean createPath = new File(file.getParent()).mkdirs();
//            logger.info("create file: " + createPath);
//        }else{
//            logger.info("redis-gui.db存在...");
//        }
//
//    }
//
//    /**
//     * 初始化连接
//     */
//    private static void initConnection() {
//        try {
//            pool = new LinkedList<>();
//            for (int i = 0; i < poolSize; i++) {
//                pool.addLast(DriverManager.getConnection(conn));//连接数据库,不存在则创建
//            }
//        } catch (SQLException throwables) {
//            throwables.printStackTrace();
//        }
//    }
//
//    /**
//     * 获取链接
//     *
//     * @return
//     */
//    private static Connection getConnection() {
//        if (pool.size() > 0 && (null == pool.getLast())) {
//            Connection conn = pool.getLast();
//            //移除这个连接池
//            pool.removeLast();
//            return conn;
//        }
//        //连接池中没有了
////        try {
////            Class.forName(drivde);
////        } catch (ClassNotFoundException e) {
////            e.printStackTrace();
////        }
//        Connection con = null;
//        try {
//            con = DriverManager.getConnection(conn);
//        } catch (SQLException throwables) {
//            throwables.printStackTrace();
//        }
//        pool.addLast(con);
//        return con;
//    }
//
//    private static synchronized Statement getStatement() {
//        try {
//            if (!(null != pub_conn && !pub_conn.isClosed())) {
//                pub_conn = getConnection();
//                if (null != pub_statement && !pub_statement.isClosed()) {
//                } else {
//                    pub_statement = pub_conn.createStatement();
//                }
//            }
//            return pub_statement;
//        } catch (SQLException throwables) {
//            throwables.printStackTrace();
//        }
//        return null;
//    }
//
//    /**
//     * 关闭资源
//     */
//    private static void closeResource() {
//        if (null != pub_statement) {
//            try {
//                pub_statement.close();
//            } catch (SQLException throwables) {
//                throwables.printStackTrace();
//            }
//        }
//        if (null != pub_conn) {
//            try {
//                pub_conn.close();
//            } catch (SQLException throwables) {
//                throwables.printStackTrace();
//            }
//        }
//    }
//
//    /**
//     * 获取驼峰的表名
//     *
//     * @param simpleName
//     * @return
//     */
//    private String getTableName(String simpleName) {
//        return CamelCaseUtil.toUnderlineCase(simpleName);
//    }
//
//    /**
//     * 获取记录的id最大值
//     *
//     * @param tabName
//     * @return
//     */
//    public static int getMaxId(String tabName) {
//        getStatement();
//        int id = -1;
//        try {
////            ResultSet rSet=getStatement().executeQuery("select max(id) id from "+tabName);
//            ResultSet rSet = pub_statement.executeQuery("select id from " + tabName + " ORDER BY id desc");
//            while (rSet.next()) {
//                logger.info(rSet.getInt(1) + "");
//                id = rSet.getInt(1);
//                break;
//            }
//        } catch (SQLException throwables) {
//            logger.info("异常了: {}",throwables.getMessage());
//        } finally {
//            closeResource();
//        }
//        return id;
//    }
//
//    /**
//     * 执行sql
//     *
//     * @param sql
//     * @return int
//     */
//    public int executeUpdate(String sql) {
//        getStatement();
//        int count = 0;
//        try {
//            count = getStatement().executeUpdate(sql);
//        } catch (SQLException throwables) {
//            throwables.printStackTrace();
//        } finally {
//            closeResource();
//        }
//        return count;
//    }
//
//    /**
//     * 根据对象保存数据
//     *
//     * @param obj
//     */
//    public int onInsert(Object obj) {
//        getStatement();
//        if (null == obj) {
//            new RuntimeException("save object is null...");
//        }
//        int id = 0;
//        StringBuffer _fieds = new StringBuffer();
//        StringBuffer _values = new StringBuffer();
//        _fieds.append("(");
//        _values.append(" values(");
//        try {
//            String fieldName = null;
//            // 获取对象属性
//            Field[] fields = obj.getClass().getDeclaredFields();
//            for (Field field : fields) {
//                fieldName = field.getName();
//                String upperChar = fieldName.substring(0, 1).toUpperCase();
//                String anotherStr = fieldName.substring(1);
//                String methodName = "get" + upperChar + anotherStr;
//                Method method = obj.getClass().getMethod(methodName, new Class[]{});
//                method.setAccessible(true);
//                Object value = method.invoke(obj, new Object[]{});
//                switch (field.getType().toString()) {
//                    case "class java.lang.String":
//                        _fieds.append("'" + fieldName + "',");
//                        _values.append("'" + value + "',");
//                        break;
//                    default:
//                        _fieds.append(fieldName + ",");
//                        _values.append(value + ",");
//                        break;
//                }
//            }
//           List<DBInfo> ls=  queryAllDBInfo();
//
//
//            String sql = "insert into "
//                    + getTableName(obj.getClass().getSimpleName()) + _fieds.substring(0, _fieds.length() - 1) + ") " + _values.substring(0, _values.length() - 1) + ")";
//            int count = pub_statement.executeUpdate(sql);
//            logger.info("[{}] insert success...", count);
//            return count;
//        } catch (Exception throwables) {
//            throwables.printStackTrace();
//        }
//        return -1;
//    }
//
//    /**
//     * 创建表
//     *
//     * @param obj
//     */
//    public void onCreateDB(Object obj) {
//        getStatement();
//        StringBuffer stringBuffer = new StringBuffer();
//        stringBuffer.append("(");
//        try {
//            String fieldName = null;
//            // 获取对象属性
//            Field[] fields = obj.getClass().getDeclaredFields();
//            for (Field field : fields) {
//                fieldName = field.getName();
//                String upperChar = fieldName.substring(0, 1).toUpperCase();
//                String anotherStr = fieldName.substring(1);
//                String methodName = "get" + upperChar + anotherStr;
//                Method method = obj.getClass().getMethod(methodName, new Class[]{});
//                method.setAccessible(true);
//                Object value = method.invoke(obj, new Object[]{});
//                // 这里可以编写你的业务代码
//                if ("id".equalsIgnoreCase(fieldName)) {
//                    stringBuffer.append(fieldName + " " + getType(field.getType().toString()) + " primary key autoincrement,");
//                } else {
//                    stringBuffer.append(fieldName + " " + getType(field.getType().toString()) + ",");
//                }
//            }
//            String sql = "create table if not exists "
//                    + getTableName(obj.getClass().getSimpleName()) + stringBuffer.substring(0, stringBuffer.length() - 1) + ")";
//            pub_statement.executeUpdate(sql);
//            logger.info("create table success");
//        } catch (SQLException throwables) {
//            throwables.printStackTrace();
//        } catch (NoSuchMethodException e) {
//            e.printStackTrace();
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//        } catch (InvocationTargetException e) {
//            e.printStackTrace();
//        } finally {
//            closeResource();
//        }
//    }
//
//    public List<Object> query(Object obj) {
//        getStatement();
//        if (null == obj) {
//            logger.error("object is null...");
//        }
//        StringBuffer stringBuffer = new StringBuffer();
//        try {
//            String fieldName = null;
//            Field[] fields = obj.getClass().getDeclaredFields();
//            for (Field field : fields) {
//                fieldName = field.getName();
//                String upperChar = fieldName.substring(0, 1).toUpperCase();
//                String anotherStr = fieldName.substring(1);
//                String methodName = "get" + upperChar + anotherStr;
//                Method method = obj.getClass().getMethod(methodName, new Class[]{});
//                method.setAccessible(true);
//                Object value = method.invoke(obj, new Object[]{});
//                if (null == value || value.toString().length() <= 0) {
//                    continue;
//                }
//                logger.info(field.getType().toString());
//                switch (field.getType().toString()) {
//                    case "class java.lang.String":
//                        stringBuffer.append(fieldName + "='" + value + "' and ");
//                        break;
//                    default:
//                        stringBuffer.append(fieldName + "=" + value + " and ");
//                        break;
//                }
//
//            }
//            String sql = "select * from " + getTableName(obj.getClass().getSimpleName()) + " where " + stringBuffer.substring(0, stringBuffer.length() - 4);
//            ResultSet rSet = pub_statement.executeQuery(sql);
//            while (rSet.next()) {
//                rSet.getString(1);
//            }
//            rSet.close();//关闭数据集
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//
//    /**
//     * 查询所有的db信息
//     *
//     * @return
//     */
//    public List<DBInfo> queryAllDBInfo() {
//        getStatement();
//        String query_sql="SELECT * FROM sqlite_master WHERE type='table' AND name='db_info'";
//        List<DBInfo> list = new ArrayList<>();
//        try {
//            ResultSet rs = pub_statement.executeQuery(query_sql);
//            if (!rs.next()) {
//                logger.info("表不存在...");
//                return null;
//            }
//            String sql = "select * from db_info";
//            ResultSet rSet = pub_statement.executeQuery(sql);
//            while (rSet.next()) {
//                rSet.getString(1);
//                DBInfo dbInfo = new DBInfo();
//                dbInfo.setId(rSet.getInt("id"));
//                dbInfo.setHost(rSet.getString("host"));
//                dbInfo.setPassWord(rSet.getString("passWord"));
//                dbInfo.setPort(rSet.getInt("port"));
//                list.add(dbInfo);
//            }
//            rSet.close();//关闭数据集
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            closeResource();
//        }
//        return list;
//    }
//
//    /**
//     * 支持的表字段数据类型包括：基本类型、包装类型、String类型、Date类型
//     */
//    private String[] types = {"java.lang.Integer",
//            "java.lang.Double",
//            "java.lang.Float",
//            "java.lang.Long",
//            "java.lang.Short",
//            "java.lang.Byte",
//            "java.lang.Boolean",
//            "java.lang.Character",
//            "java.lang.String",
//            "java.util.Date",
//            "int",
//            "double",
//            "long",
//            "short",
//            "byte",
//            "boolean",
//            "char",
//            "float"};
//
//    /**
//     * 获取sqlite类型
//     *
//     * @param key
//     * @return
//     */
//    private String getType(String key) {
//        Map<String, String> maps = new HashMap<>();
//        maps.put("java.lang.Integer", "integer");
//        maps.put("java.lang.Double", "double");
//        maps.put("java.lang.Float", "float");
//        maps.put("java.lang.Long", "long");
//        maps.put("java.lang.Short", "short");
//        maps.put("java.lang.Byte", "byte");
//        maps.put("java.lang.Boolean", "boolean");
//        maps.put("java.lang.String", "varchar(255)");
//        maps.put("class java.lang.String", "varchar(255)");
//        maps.put("int", "integer");
//        return maps.get(key) == null ? key : maps.get(key);
//    }
//
//    /**
//     * 组装sql
//     *
//     * @param obj
//     * @param operationType
//     * @return
//     */
//    private String assembleSQL(Object obj, int operationType) {
//        StringBuffer sqlBuffer = new StringBuffer();
//        try {
//            if (null == obj) {
//                new RuntimeException("object is null...");
//            }
//            logger.info("对象名：" + obj.getClass().getSimpleName());
//            switch (operationType) {
//                case 1:
//                    //保存
//                    break;
//                case 2:
//                    //查询
//                    break;
//                case 3:
//                    //修改
//                    break;
//                case 4:
//                    //删除
//                    break;
//            }
//            // 获取对象属性
//            Field[] fields = obj.getClass().getDeclaredFields();
//            for (Field field : fields) {
//                String fieldName = field.getName();
//                String upperChar = fieldName.substring(0, 1).toUpperCase();
//                String anotherStr = fieldName.substring(1);
//                String methodName = "get" + upperChar + anotherStr;
//                Method method = obj.getClass().getMethod(methodName, new Class[]{});
//                method.setAccessible(true);
//                Object value = method.invoke(obj, new Object[]{});
//                // 这里可以编写你的业务代码
//                logger.info(fieldName + ": " + value);
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return sqlBuffer.toString();
//    }
//
//    /**
//     * 初始化db
//     */
//    public void initDB() {
//        onCreateDB(new DBInfo("127.0.0.1:6379"));
//        getStatement();
//        try {
//            String sql = "insert into db_info(id,host,port) values(1,'127.0.0.1',6379);";
//            pub_statement.executeUpdate(sql);
//        } catch (SQLException throwables) {
//            throwables.printStackTrace();
//        } finally {
//            closeResource();
//        }
//    }
//
//    public static Settings getSettingsByKey(String sql) {
//        getStatement();
//        try {
//            ResultSet rs = pub_statement.executeQuery(sql);
//            while (rs.next()) {
//                Settings settings = new Settings();
//                int id = Integer.parseInt(rs.getString("id"));
//                settings.setId(id);
//                String _key = rs.getString("key");
//                settings.setKey(_key);
//                String value = rs.getString("value");
//                settings.setValue(value);
//                return settings;
//            }
//            rs.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }finally {
//            closeResource();
//        }
//        return null;
//    }
//
//    public static boolean setUpdate(String key, String selected) {
//        String sql="update settings set value='"+selected+"' where key='"+key+"'";
//        getStatement();
//        try {
//           return pub_statement.executeUpdate(sql) > 0;
//        } catch (SQLException throwables) {
//            throwables.printStackTrace();
//        }finally {
//            closeResource();
//        }
//        return false;
//    }
//
//    public static boolean insertSettings(String update, String selected) {
//        String sql="insert into settings('key','value') values('"+update+"','"+String.valueOf(selected).toUpperCase()+"')";
//        getStatement();
//        try {
//           return pub_statement.execute(sql);
//        } catch (SQLException throwables) {
//            throwables.printStackTrace();
//        }finally {
//            closeResource();
//        }
//        return false;
//    }
//
//    public static boolean execute(String sql) {
//        getStatement();
//        try {
//          return pub_statement.execute(sql);
//        } catch (SQLException throwables) {
//            throwables.printStackTrace();
//        }finally {
//            closeResource();
//        }
//        return false;
//    }
//
//
//
//    /**
//     * 判断某张表是否存在
//     * @param tableName 表名
//     * @return
//     */
//    public static boolean tabbleIsExist(String tableName){
//        if(tableName == null){
//            return false;
//        }
//        try {
//            getStatement();
//            //这里表名可以是Sqlite_master
//            String sql = "select count(*) as c from sqlite_master where type ='table' and name ='"+tableName.trim()+"' ";
//            ResultSet rSet = pub_statement.executeQuery(sql);
//            return rSet.next();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return false;
//    }
//}
